!function (e) {
    e.fn.extend({
        slimScroll: function (i) {
            var o = {
                    width: "auto",
                    height: "250px",
                    size: "7px",
                    color: "#000",
                    position: "right",
                    distance: "1px",
                    start: "top",
                    opacity: .4,
                    alwaysVisible: !1,
                    disableFadeOut: !1,
                    railVisible: !1,
                    railColor: "#333",
                    railOpacity: .2,
                    railDraggable: !0,
                    railClass: "slimScrollRail",
                    barClass: "slimScrollBar",
                    wrapperClass: "slimScrollDiv",
                    allowPageScroll: !1,
                    wheelStep: 20,
                    touchScrollStep: 200,
                    borderRadius: "7px",
                    railBorderRadius: "7px"
                },
                s = e.extend(o, i);
            return this.each(function () {
                function o(t) {
                    if (h) {
                        var t = t || window.event,
                            i = 0;
                        t.wheelDelta && (i = -t.wheelDelta / 120), t.detail && (i = t.detail / 3);
                        var o = t.target || t.srcTarget || t.srcElement;
                        e(o).closest("." + s.wrapperClass).is(x.parent()) && r(i, !0), t.preventDefault && !y && t.preventDefault(), y || (t.returnValue = !1)
                    }
                }

                function r(e, t, i) {
                    y = !1;
                    var o = e,
                        r = x.outerHeight() - R.outerHeight();
                    if (t && (o = parseInt(R.css("top")) + e * parseInt(s.wheelStep) / 100 * R.outerHeight(), o = Math.min(Math.max(o, 0), r), o = e > 0 ? Math.ceil(o) : Math.floor(o), R.css({
                        top: o + "px"
                    })), v = parseInt(R.css("top")) / (x.outerHeight() - R.outerHeight()), o = v * (x[0].scrollHeight - x.outerHeight()), i) {
                        o = e;
                        var a = o / x[0].scrollHeight * x.outerHeight();
                        a = Math.min(Math.max(a, 0), r), R.css({
                            top: a + "px"
                        })
                    }
                    x.scrollTop(o), x.trigger("slimscrolling", ~~o), n(), c()
                }

                function a(e) {
                    window.addEventListener ? (e.addEventListener("DOMMouseScroll", o, !1), e.addEventListener("mousewheel", o, !1)) : document.attachEvent("onmousewheel", o)
                }

                function l() {
                    f = Math.max(x.outerHeight() / x[0].scrollHeight * x.outerHeight(), m), R.css({
                        height: f + "px"
                    });
                    var e = f == x.outerHeight() ? "none" : "block";
                    R.css({
                        display: e
                    })
                }

                function n() {
                    if (l(), clearTimeout(p), v == ~~v) {
                        if (y = s.allowPageScroll, b != v) {
                            var e = 0 == ~~v ? "top" : "bottom";
                            x.trigger("slimscroll", e)
                        }
                    } else y = !1;
                    return b = v, f >= x.outerHeight() ? void(y = !0) : (R.stop(!0, !0).fadeIn("fast"), void(s.railVisible && E.stop(!0, !0).fadeIn("fast")))
                }

                function c() {
                    s.alwaysVisible || (p = setTimeout(function () {
                        s.disableFadeOut && h || u || d || (R.fadeOut("slow"), E.fadeOut("slow"))
                    }, 1e3))
                }

                var h, u, d, p, g, f, v, b, w = "<div></div>",
                    m = 30,
                    y = !1,
                    x = e(this);
                if (x.parent().hasClass(s.wrapperClass)) {
                    var C = x.scrollTop();
                    if (R = x.closest("." + s.barClass), E = x.closest("." + s.railClass), l(), e.isPlainObject(i)) {
                        if ("height" in i && "auto" == i.height) {
                            x.parent().css("height", "auto"), x.css("height", "auto");
                            var H = x.parent().parent().height();
                            x.parent().css("height", H), x.css("height", H)
                        }
                        if ("scrollTo" in i) C = parseInt(s.scrollTo);
                        else if ("scrollBy" in i) C += parseInt(s.scrollBy);
                        else if ("destroy" in i) return R.remove(), E.remove(), void x.unwrap();
                        r(C, !1, !0)
                    }
                } else if (!(e.isPlainObject(i) && "destroy" in i)) {
                    s.height = "auto" == s.height ? x.parent().height() : s.height;
                    var S = e(w).addClass(s.wrapperClass).css({
                        position: "relative",
                        overflow: "hidden",
                        width: s.width,
                        height: s.height
                    });
                    x.css({
                        overflow: "hidden",
                        width: s.width,
                        height: s.height
                    });
                    var E = e(w).addClass(s.railClass).css({
                            width: s.size,
                            height: "100%",
                            position: "absolute",
                            top: 0,
                            display: s.alwaysVisible && s.railVisible ? "block" : "none",
                            "border-radius": s.railBorderRadius,
                            background: s.railColor,
                            opacity: s.railOpacity,
                            zIndex: 90
                        }),
                        R = e(w).addClass(s.barClass).css({
                            background: s.color,
                            width: s.size,
                            position: "absolute",
                            top: 0,
                            opacity: s.opacity,
                            display: s.alwaysVisible ? "block" : "none",
                            "border-radius": s.borderRadius,
                            BorderRadius: s.borderRadius,
                            MozBorderRadius: s.borderRadius,
                            WebkitBorderRadius: s.borderRadius,
                            zIndex: 99
                        }),
                        D = "right" == s.position ? {
                            right: s.distance
                        } : {
                            left: s.distance
                        };
                    E.css(D), R.css(D), x.wrap(S), x.parent().append(R), x.parent().append(E), s.railDraggable && R.bind("mousedown", function (i) {
                        var o = e(document);
                        return d = !0, t = parseFloat(R.css("top")), pageY = i.pageY, o.bind("mousemove.slimscroll", function (e) {
                            currTop = t + e.pageY - pageY, R.css("top", currTop), r(0, R.position().top, !1)
                        }), o.bind("mouseup.slimscroll", function (e) {
                            d = !1, c(), o.unbind(".slimscroll")
                        }), !1
                    }).bind("selectstart.slimscroll", function (e) {
                        return e.stopPropagation(), e.preventDefault(), !1
                    }), E.hover(function () {
                        n()
                    }, function () {
                        c()
                    }), R.hover(function () {
                        u = !0
                    }, function () {
                        u = !1
                    }), x.hover(function () {
                        h = !0, n(), c()
                    }, function () {
                        h = !1, c()
                    }), x.bind("touchstart", function (e, t) {
                        e.originalEvent.touches.length && (g = e.originalEvent.touches[0].pageY)
                    }), x.bind("touchmove", function (e) {
                        if (y || e.originalEvent.preventDefault(), e.originalEvent.touches.length) {
                            var t = (g - e.originalEvent.touches[0].pageY) / s.touchScrollStep;
                            r(t, !0), g = e.originalEvent.touches[0].pageY
                        }
                    }), l(), "bottom" === s.start ? (R.css({
                        top: x.outerHeight() - R.outerHeight()
                    }), r(0, !0)) : "top" !== s.start && (r(e(s.start).position().top, null, !0), s.alwaysVisible || R.hide()), a(this)
                }
            }), this
        }
    }), e.fn.extend({
        slimscroll: e.fn.slimScroll
    })
}(jQuery);